package com.visizen.wisdomclass.server.client;

import com.visizen.wisdomclass.server.model.WcScore;
import com.visizen.wisdomclass.server.model.WcScoreExample;
import com.visizen.wisdomclass.server.model.WcScoreExample.Criteria;
import com.visizen.wisdomclass.server.model.WcScoreExample.Criterion;

import java.text.MessageFormat;
import java.util.List;
import java.util.Map;

import static org.apache.ibatis.jdbc.SqlBuilder.*;

public class WcScoreSqlProvider {

    /**
     * This method was generated by MyBatis Generator. This method corresponds to the database table wc_score
     *
     * @mbggenerated
     */
    public String countByExample(WcScoreExample example) {
        BEGIN();
        SELECT("count(*)");
        FROM("wc_score");
        applyWhere(example, false);
        return SQL();
    }

    /**
     * This method was generated by MyBatis Generator. This method corresponds to the database table wc_score
     *
     * @mbggenerated
     */
    public String deleteByExample(WcScoreExample example) {
        BEGIN();
        DELETE_FROM("wc_score");
        applyWhere(example, false);
        return SQL();
    }

    /**
     * This method was generated by MyBatis Generator. This method corresponds to the database table wc_score
     *
     * @mbggenerated
     */
    public String insertSelective(WcScore record) {
        BEGIN();
        INSERT_INTO("wc_score");
        if (record.getScore_id() != null) {
            VALUES("score_id", "#{score_id,jdbcType=BIGINT}");
        }
        if (record.getExam_id() != null) {
            VALUES("exam_id", "#{exam_id,jdbcType=BIGINT}");
        }
        if (record.getUser_id() != null) {
            VALUES("user_id", "#{user_id,jdbcType=BIGINT}");
        }
        if (record.getScore_value() != null) {
            VALUES("score_value", "#{score_value,jdbcType=INTEGER}");
        }
        return SQL();
    }

    public String insertList(Map<String, List<WcScore>> records) {
        List<WcScore> scores = records.get("records");
        StringBuilder sb = new StringBuilder();
        sb.append("INSERT INTO wc_score(exam_id,user_id,score_value) VALUES");
        MessageFormat messageFormat = new MessageFormat("(#'{'records[{0}].exam_id},#'{'records[{0}].user_id},#'{'records[{0}].score_value})");
        for (int i = 0; i < scores.size(); i++) {
            sb.append(messageFormat.format(new Object[]{i}));
            if (i < scores.size() - 1) {
                sb.append(",");
            }
        }
        return sb.toString();
    }

    /**
     * This method was generated by MyBatis Generator. This method corresponds to the database table wc_score
     *
     * @mbggenerated
     */
    public String selectByExample(WcScoreExample example) {
        BEGIN();
        if (example != null && example.isDistinct()) {
            SELECT_DISTINCT("score_id");
        } else {
            SELECT("score_id");
        }
        SELECT("exam_id");
        SELECT("user_id");
        SELECT("score_value");
        FROM("wc_score");
        applyWhere(example, false);
        if (example != null && example.getOrderByClause() != null) {
            ORDER_BY(example.getOrderByClause());
        }
        return SQL();
    }

    /**
     * This method was generated by MyBatis Generator. This method corresponds to the database table wc_score
     *
     * @mbggenerated
     */
    public String updateByExampleSelective(Map<String, Object> parameter) {
        WcScore record = (WcScore) parameter.get("record");
        WcScoreExample example = (WcScoreExample) parameter.get("example");
        BEGIN();
        UPDATE("wc_score");
        if (record.getScore_id() != null) {
            SET("score_id = #{record.score_id,jdbcType=BIGINT}");
        }
        if (record.getExam_id() != null) {
            SET("exam_id = #{record.exam_id,jdbcType=BIGINT}");
        }
        if (record.getUser_id() != null) {
            SET("user_id = #{record.user_id,jdbcType=BIGINT}");
        }
        if (record.getScore_value() != null) {
            SET("score_value = #{record.score_value,jdbcType=INTEGER}");
        }
        applyWhere(example, true);
        return SQL();
    }

    /**
     * This method was generated by MyBatis Generator. This method corresponds to the database table wc_score
     *
     * @mbggenerated
     */
    public String updateByExample(Map<String, Object> parameter) {
        BEGIN();
        UPDATE("wc_score");
        SET("score_id = #{record.score_id,jdbcType=BIGINT}");
        SET("exam_id = #{record.exam_id,jdbcType=BIGINT}");
        SET("user_id = #{record.user_id,jdbcType=BIGINT}");
        SET("score_value = #{record.score_value,jdbcType=INTEGER}");
        WcScoreExample example = (WcScoreExample) parameter.get("example");
        applyWhere(example, true);
        return SQL();
    }

    /**
     * This method was generated by MyBatis Generator. This method corresponds to the database table wc_score
     *
     * @mbggenerated
     */
    public String updateByPrimaryKeySelective(WcScore record) {
        BEGIN();
        UPDATE("wc_score");
        if (record.getExam_id() != null) {
            SET("exam_id = #{exam_id,jdbcType=BIGINT}");
        }
        if (record.getUser_id() != null) {
            SET("user_id = #{user_id,jdbcType=BIGINT}");
        }
        if (record.getScore_value() != null) {
            SET("score_value = #{score_value,jdbcType=INTEGER}");
        }
        WHERE("score_id = #{score_id,jdbcType=BIGINT}");
        return SQL();
    }

    /**
     * This method was generated by MyBatis Generator. This method corresponds to the database table wc_score
     *
     * @mbggenerated
     */
    protected void applyWhere(WcScoreExample example, boolean includeExamplePhrase) {
        if (example == null) {
            return;
        }
        String parmPhrase1;
        String parmPhrase1_th;
        String parmPhrase2;
        String parmPhrase2_th;
        String parmPhrase3;
        String parmPhrase3_th;
        if (includeExamplePhrase) {
            parmPhrase1 = "%s #{example.oredCriteria[%d].allCriteria[%d].value}";
            parmPhrase1_th = "%s #{example.oredCriteria[%d].allCriteria[%d].value,typeHandler=%s}";
            parmPhrase2 = "%s #{example.oredCriteria[%d].allCriteria[%d].value} and #{example.oredCriteria[%d].criteria[%d].secondValue}";
            parmPhrase2_th = "%s #{example.oredCriteria[%d].allCriteria[%d].value,typeHandler=%s} and #{example.oredCriteria[%d].criteria[%d].secondValue,typeHandler=%s}";
            parmPhrase3 = "#{example.oredCriteria[%d].allCriteria[%d].value[%d]}";
            parmPhrase3_th = "#{example.oredCriteria[%d].allCriteria[%d].value[%d],typeHandler=%s}";
        } else {
            parmPhrase1 = "%s #{oredCriteria[%d].allCriteria[%d].value}";
            parmPhrase1_th = "%s #{oredCriteria[%d].allCriteria[%d].value,typeHandler=%s}";
            parmPhrase2 = "%s #{oredCriteria[%d].allCriteria[%d].value} and #{oredCriteria[%d].criteria[%d].secondValue}";
            parmPhrase2_th = "%s #{oredCriteria[%d].allCriteria[%d].value,typeHandler=%s} and #{oredCriteria[%d].criteria[%d].secondValue,typeHandler=%s}";
            parmPhrase3 = "#{oredCriteria[%d].allCriteria[%d].value[%d]}";
            parmPhrase3_th = "#{oredCriteria[%d].allCriteria[%d].value[%d],typeHandler=%s}";
        }
        StringBuilder sb = new StringBuilder();
        List<Criteria> oredCriteria = example.getOredCriteria();
        boolean firstCriteria = true;
        for (int i = 0; i < oredCriteria.size(); i++) {
            Criteria criteria = oredCriteria.get(i);
            if (criteria.isValid()) {
                if (firstCriteria) {
                    firstCriteria = false;
                } else {
                    sb.append(" or ");
                }
                sb.append('(');
                List<Criterion> criterions = criteria.getAllCriteria();
                boolean firstCriterion = true;
                for (int j = 0; j < criterions.size(); j++) {
                    Criterion criterion = criterions.get(j);
                    if (firstCriterion) {
                        firstCriterion = false;
                    } else {
                        sb.append(" and ");
                    }
                    if (criterion.isNoValue()) {
                        sb.append(criterion.getCondition());
                    } else if (criterion.isSingleValue()) {
                        if (criterion.getTypeHandler() == null) {
                            sb.append(String.format(parmPhrase1, criterion.getCondition(), i, j));
                        } else {
                            sb.append(String.format(parmPhrase1_th, criterion.getCondition(), i, j, criterion.getTypeHandler()));
                        }
                    } else if (criterion.isBetweenValue()) {
                        if (criterion.getTypeHandler() == null) {
                            sb.append(String.format(parmPhrase2, criterion.getCondition(), i, j, i, j));
                        } else {
                            sb.append(String.format(parmPhrase2_th, criterion.getCondition(), i, j, criterion.getTypeHandler(), i, j, criterion.getTypeHandler()));
                        }
                    } else if (criterion.isListValue()) {
                        sb.append(criterion.getCondition());
                        sb.append(" (");
                        List<?> listItems = (List<?>) criterion.getValue();
                        boolean comma = false;
                        for (int k = 0; k < listItems.size(); k++) {
                            if (comma) {
                                sb.append(", ");
                            } else {
                                comma = true;
                            }
                            if (criterion.getTypeHandler() == null) {
                                sb.append(String.format(parmPhrase3, i, j, k));
                            } else {
                                sb.append(String.format(parmPhrase3_th, i, j, k, criterion.getTypeHandler()));
                            }
                        }
                        sb.append(')');
                    }
                }
                sb.append(')');
            }
        }
        if (sb.length() > 0) {
            WHERE(sb.toString());
        }
    }
}